const SparkMD5 = require("spark-md5");
const crypto = require("crypto"); // 内置

/**
 * 正常使用  hex hash
 * @param {string} params
 * @returns
 */
function hexHash(params) {
  return SparkMD5.hash(params);
}

/**
 * 加密
 * @param {*} data -要加密的数据
 * @param {*} key -加密使用的密钥
 * @returns
 */
function encrypt(data, key) {
  const algorithm = "aes-256-cbc";
  const iv = crypto.randomBytes(16); // 生成一个16字节的随机初始化向量
  const cipher = crypto.createCipheriv(algorithm, key, iv); // 创建一个加密器，指定使用AES-256-CBC算法和密钥和初始化向量。

  // 使用cipher.update方法对数据进行加密，并指定输入数据的编码格式为UTF-8，输出数据的编码格式为16进制（hex）
  let encrypted = cipher.update(data, "utf8", "hex");
  encrypted += cipher.final("hex"); // 使用cipher.final方法获取加密的最后一块数据，并将其转换为16进制格式。
  const result = {
    iv: iv.toString("hex"),
    encryptedData: encrypted,
  };
  return result; // 返回一个包含初始化向量和加密后的数据的对象。
}

/**
 * 解密
 * @param {*} encryptedData -要解密的数据
 * @param {*} key -加密使用的密钥
 * @param {*} iv -iv表示初始化向量
 * @returns
 */
function decrypt(encryptedData, key, iv) {
  const algorithm = "aes-256-cbc";
  const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(iv, "hex"));

  let decrypted = decipher.update(encryptedData, "hex", "utf8");
  decrypted += decipher.final("utf8");
  return decrypted;
}

// // 创建加密密钥
// const key = crypto.randomBytes(32);
// // // const key = Buffer.from("11111111111111111111111111111111"); // <Buffer 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31>
// // const key = Buffer.from([
// //   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
// //   28, 29, 30, 31, 32,
// // ]);
// // console.log("q加密密钥:", key.toString("hex")); //  0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20

// // 要加密的数据
// const data = "Hello, World!";

// // 加密数据
// const encrypted = encrypt(data, key);
// console.log("加密后的数据:", encrypted);

// // 解密数据
// const decrypted = decrypt(encrypted.encryptedData, key, encrypted.iv);
// console.log("解密后的数据:", decrypted);

module.exports = {
  hexHash,
  encrypt,
  decrypt,
};
